package net.xt.testthread;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

public class TestSynchronousQueue {

    private static SynchronousQueue queue = new SynchronousQueue();

    public static void main(String[] args) {
        // 生产者1
        new Thread(() -> {
            try {
                queue.put("element1");
                System.out.println(Thread.currentThread().getName() + "生成一个元素");
                TimeUnit.SECONDS.sleep(2);  // 和消费者线程时间尽量保持一致，则能够让消费者立即消费
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "生产者1").start();

        // 生产者2
        new Thread(() -> {
            try {
                queue.put("element2");
                System.out.println(Thread.currentThread().getName() + "生成一个元素");
                TimeUnit.SECONDS.sleep(5);  // 和消费者线程时间尽量保持一致，则能够让消费者立即消费
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "生产者2").start();

        // 消费者1
        new Thread(() -> {
            try {
                Object object = queue.take();
                System.out.println(Thread.currentThread().getName() + "消费一个元素：" + object);
                TimeUnit.SECONDS.sleep(2);  // 和消费者线程时间尽量保持一致，则能够立即消费
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "消费者1").start();

        // 消费者2
        new Thread(() -> {
            try {
                Object object = queue.take();
                System.out.println(Thread.currentThread().getName() + "消费一个元素：" + object);
                TimeUnit.SECONDS.sleep(5);  // 和生产者线程时间尽量保持一致，则能够立即消费
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "消费者2").start();
    }
}
